package TDAMapeo;

import Excepciones.InvalidKeyException;
import TDALista.DoubleLinkedList;
import TDALista.PositionList;


public class MapeoHashAbierto<K, V> implements Map<K, V> {
	
	private Mapeo<K,V>[] map;
	private int size;
	private int capacidad;
	
	public MapeoHashAbierto (){
		capacidad = 10;
		map = new Mapeo[capacidad];
		for (int i = 0 ; i < capacidad ; i++)
			map[i] = new Mapeo<K,V>();
		size = 0;
	}

	@Override
	public int size() {
		return size;
	}

	@Override
	public boolean isEmpty() {
		return size == 0;
	}

	@Override
	public V get(K key) throws InvalidKeyException {
		K k = checkKey (key);
		
		int lugar = funcionHash(k);
		
		return map[lugar].get(k);
		
	}
	
	
	private int funcionHash(K key){
		
		int llave = key.hashCode();
		return Math.abs(llave %capacidad);
	}
	
	private K checkKey (K k) throws InvalidKeyException{
		
		K llave = null;
		try{
			llave = (K) k;
		}catch (ClassCastException e){ throw new InvalidKeyException("Llave incorrecta");}
		return llave;
	}

	@Override
	public V put(K key, V value) throws InvalidKeyException {
		
		K k = checkKey (key);
		int lugar = funcionHash(k);
		V valor = map[lugar].put(k, value);
		if (valor == null)
			size++;
		return valor;
		
	}

	@Override
	public V remove(K key) throws InvalidKeyException {

		K k = checkKey (key);
		int lugar = funcionHash(k);
		V valor = map[lugar].remove(k);
		if (valor != null)
			size--;
		return valor;
	}

	@Override
	public Iterable<K> keys() {
		PositionList<K> lista = new DoubleLinkedList<K>();
		
		for (Entry<K,V> e: entries())
			lista.addLast(e.getKey());
		return lista;
	}

	@Override
	public Iterable<V> values() {
	PositionList<V> lista = new DoubleLinkedList<V>();
		
		for (Entry<K,V> e: entries())
			lista.addLast(e.getValue());
		return lista;
	}

	@Override
	public Iterable<Entry<K, V>> entries() {
		PositionList<Entry<K,V>> lista = new DoubleLinkedList<Entry<K,V>>();
		
		for (int i =0; i<capacidad; i++){
			for (Entry<K,V> e: map[i].entries()){
				lista.addLast(e);
			}
		}
		return lista;
		
	}

}
